home *** CD-ROM | disk | FTP | other *** search
/ Carousel Volume 2 #1 / carousel.iso / mactosh / hc / windoid4.sit / Windoid #4.TXT
Text File  |  1988-11-29  |  21KB  |  372 lines

  1. Vol 1 Number 4
  2.  
  3.  
  4.  
  5. In the fourth issue of WINDOID, we address more of the many questions and problems people have sent in.  Quite a number of people have expressed interest in moving a group of buttons or fields on a card.  Sioux Lacy, one of our outstanding HyperCard testers, has given us a way to group buttons and/or fields and move them, in a group, within a card and even onto other cards.  Sioux has also written for us an article on Finding multi-word strings in blocks of text.  This is one that everyone has asked for.
  6.  
  7. Phil Wyman, with assistance from Steve All, two more great HyperCard testers, have given us further HyperCard user tips.  We really appreciate all of the cards people have sent us with the tips they have found.  In this way we can pass on useful tips to many hundreds of HyperCard users.
  8.  
  9. Paul Foraker, our newest tester, has submitted an AutoLink script.  Using this great little shortcut for scripting buttons gives you another productivity tip I am sure you will find interesting.
  10.  
  11. Steve Maller has done it again!  ResCopy is his latest XCMD effort to give us a safe, elegant, and easy way to move resources around in HyperCard.  This version is his ╥shipping╙ version and does not have a time bomb in it.  You are free to give it away to your HyperCarding friends.  This is one stack that people who do not have it will lust for.
  12.  
  13. Sioux Lacy has given us Groupies 1.3, featured in this issue of WINDOID.  This is a must stack for serious HyperCard users.  I really appreciate Sioux╒s efforts in bringing us all of these great articles and I am equally sure that you will also.
  14.  
  15. These two stack are on the Apple HyperCard User Group file server and can be obtained only here in Cupertino.  If your favorite bulletin board does not have them, please ask them to have someone upload them.
  16. ==========
  17. AutoLink
  18. by Paul Foraker
  19.  
  20. Shortly after you get HyperCard installed on your hard disk, you may notice that you are collecting a large number of other people╒s stacks. One way of keeping track of all of them is to stuff them into a folder and put a button for them on a card in your Home stack. Since the original Home card already comes with 19 buttons (and room for about 24), you might want to make another card for holding buttons that take you to your miscellaneous stacks. To avoid having to name and link all the buttons on a new card to the stacks I╒ve collected, I wrote a variation on Danny Goodman╒s script which takes you to a stack even though the button has no script or link.
  21.  
  22. In this version, a button named ╥new button╙ opens the familiar Standard File dialog and then gets the name of whatever stack you select, changes the name of itself (the button) to the selected stack, then goes there.  If the button already has a name (other than ╥new button╙), the script simply goes to the stack.  This eliminates the necessity for linking or scripting multiple buttons on a card.
  23.  
  24. To start from scratch from your Home card, select New Card (CMD-N) and title the new card ╥BackYard╙ (or anything else fun). Type the script below into the script window for the card.  (You can skip over typing the comments if you wish.) Then make a new button (you can select an icon for it ╤ I use the generic stack icon). Now hold down the Option key and drag copies of the ╥new button╙ around onto your card.  (You can use the Shift key to constrain the movement so they╒re lined up neatly.)   
  25.  
  26. Next, select the Browse tool again and click on one of your new buttons. You╒ll get Standard File asking you ╥where 
  27. is the stack you want?╙  Double click on one of the stacks in the list, the new button will get a name change, and 
  28. you╒ll be off to the new stack. From there, you can hit the escape (~) key to go right back to the BackYard to AutoLink another button.
  29.  
  30. --AutoLink script
  31. --variation on Danny Goodman╒s script
  32. --by Paul Foraker
  33.  
  34. on mouseUp
  35.   put the short name of this stack ┬
  36.   into thisStack                    --saving the name for 
  37.                                     --use later
  38.    get the short name of the target --puts the ╘short╒ name of the 
  39.                                     --button you clicked on into ╘it╒
  40.    if it is ╥new button╙ then       --Oh boy... a new stack has arrived!
  41.      push card                      --saves the BackYard card id 
  42.                                     --so we can come back to it
  43.      set lockMessages to true       --stops any other scripts from running
  44.      set lockScreen to true         --freezes the screen so we╒re not 
  45.  ╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩╩               --distracted by fast moving cards.
  46.      go stack ╥the stack you want?╙ --since there is no stack by that
  47.                                     --name, HyperCard will respond by 
  48.                                     --asking you where it is.
  49.                                     --Standard File will open and you 
  50.                                     --can select a stack
  51.                                     --or click on Cancel.
  52.      get the short name of this stack    --here we╒re asking for the
  53.                                          --short name of the ╘new╒ stack
  54.  
  55.     if it is thisStack then    --checking for clicking on the Cancel button
  56.        pop card                       --go back to our BackYard card
  57.        set lockScreen to false        --unlocking the screen display
  58.        exit mouseUp                   --pretend it never happened
  59.      end if                           --end of checking for ╘cancel╒
  60.      
  61.     put it into stackName      --putting short name of the stack into 
  62.                                --╒stackName╒
  63.      pop card                  --go back to our BackYard card
  64.      set the name of the target to stackName      --rename the button
  65.      set showName of the target to true         --we want to see the name
  66.      set the script of the target to empty  --make sure there╒s no script in
  67.                                             --the button
  68.      set lockScreen to false           --unlocking the screen display
  69.      set lockMessages to false         --now messages can fly around again.
  70.    end if                              --marks the end of the loop
  71.                                        --for a ╘new button.╒
  72.  
  73.    --now, we make sure you didn╒t click on the card or background:
  74.      if the short name of target is the short name of this card then exit mouseUp
  75.      if the short name of target is the short name of this bkgnd then exit mouseUp
  76.  
  77.    visual iris open to black      --just for fun
  78.    go STACK it                    --╘it╒ will be either the new stack or
  79.                                   ╤one that╒s already been identified
  80.    end mouseUp
  81. ==========
  82. HyperCard Hints
  83. by Phil Wyman
  84.  
  85. 1.     There are some interesting properties in HyperTalk that you may not know about:
  86.  
  87. a.  <the version> is a global property which tells you which version of HyperCard you are currently using.  This property will become very useful after new versions are released. Since the new versions will have added features that old versions do not understand, stack developers will want to check to see if their stack is currently running on a version of HyperCard that supports those new features.
  88.  
  89. b.  <the name> is another global property. It will tell you that the name of the program is HyperCard. I have not found a way to use this yet, so if anyone has any ideas, let me know.
  90.  
  91. c.  <the diskspace> is a global property which will tell you how many bytes you have left on the drive that the current stack is located on.
  92.  
  93. 2.    You can send a message up the heirarchy manually by using the message box.  For instance, if you want an OPENSTACK message sent without having to reopen your stack, just type OPENSTACK into the message box and hit return or enter. Any handler, starting with any handler in the current card, which uses OPENSTACK, will receive that message.
  94.  
  95. Some users are having trouble sending their own messages. In a script, you can just type the name of your message on a line by itself and that message will be sent. If HyperCard does not find a handler with that message, it will throw up a dialog telling you it can╒t understand <message>.
  96.  
  97. You can also send a message with the <send> command. You can have difficulty with the <send> command if you are trying to send across stacks. Try going to the stack first before using <send>. For example:
  98. send mouseup to button 1┬ of card 1 of stack "Home"
  99. will generate a HyperCard error "expected end of line after send". To get the "mouseup"  message to the button, try this:
  100. go to card 1 of stack "Home"
  101. send mouseup to button 1
  102.     
  103. 3.    When you are printing your script from the script editor, you do not have to print the whole script. If you want to just print a portion of your script, then select the part you want, then click on the print button. Only your selected text will print.
  104.  
  105. 4.   The Tab key moves you between fields on a card in the order of their field number (which can be changed with Bring Closer and Send Farther).  But a useful fact for data entry is that Shift-Tab navigates you through fields in reverse order.
  106.  
  107. 5.   Choosing a selection with the Selection tool can leave you with a lot of extra white space surrounding your selection.  And you may already know that Command-S shrinks a selection rectangle until there is no surrounding white space.  What if you want a rectangular selection but no extra white space?  Hold down the Command key before selecting with the Selection tool and just that will happen.
  108.  
  109. 6.   If you are writing commercial stacks and need to restrict the user-level, you may wish to tell users in your About Box that they can access ╥Full Menus╙ by holding down the Command key before clicking the menu.
  110.  
  111. 7.   So you think that those tiny pictures in ╥Recent╙ are neat?  You can create them yourself.  Copy a card and hold down the Shift key when pasting it back in.  You╒ll get an image of the card in miniature (but no actions from buttons or fields to type into).
  112.  
  113. There are three ways in which the script writer can inquire about the presence of a string in a block of text:  FIND, CONTAINS and OFFSET.  
  114. These can be used separately or in combination.
  115. The FIND command will highlight the next occurence of the first word of the string if all words in the string are somewhere on the card.
  116. Another option is to test if a particular container (field or variable) CONTAINS the string.
  117. This test will determine an exact match on the entire string.
  118. The function OFFSET will return the character in the container on which the match begins.  This can also be used to test IF the field/variable includes the string, since if it does NOT, offset will return 0.  Depending on the context of the search, the script writer may opt for one or a combination of these.  If the scope of the search is small, and across known fields, CONTAINS or OFFSET can be used.  However, if the search is across many fields in a large stack, FIND is a good mechanism to narrow down the number of fields that have to be examined to see if they CONTAIN the string.
  119.  
  120. To FIND a multi-word string
  121.  
  122. For example, you would like to find an exact match for the string ╥Hello there╙.   You will discover that HyperCard is generous in its find criteria, and also matches the following:  ╥Hello world.  Is there life out there?╙  
  123.  
  124. This can be problematic if the search is taking place inside a handler, rather than at the control of a human who can continue to hit the return key.   The way to circumvent this is to do your match in 2 steps.  Supposing you expect the match to be in a background field, try calling a function (until you╒ve searched the entire stack) that does this:
  125.  
  126. function multiWordFind string
  127.    repeat with x = 1 to the number of bkgnd fields                      
  128.        if field x contains string then return "FOUND in field " & x
  129.    end repeat
  130.    return "NOT FOUND"
  131. end multiWordFind
  132.  
  133. (If you expected the match to be in a card field, repeat also for the number of card fields.)
  134.  
  135. on searchStackFor string
  136.      set lockScreen to true
  137.      find string
  138.      if the result is "Not Found" then cleanExit┬              
  139.      "This stack doesn╒t contain: " & string
  140.                   --Use the above two lines or use the script
  141.                     --at the end as an alternate to find offset.
  142.      put the id of this card into startedHere
  143.      repeat
  144.        get multiWordFind (string)
  145.        if word 1 of it is "FOUND" then cleanExit it
  146.        go next card -- so a subsequent find won╒t find the same              
  147.                     -- card over again                                
  148.        find string
  149.        if the id of this card is startedHere then cleanExit┬                         "This stack doesn╒t contain: " & string
  150.      end repeat
  151. end searchStackFor
  152.  
  153. on cleanExit prompt
  154.    put prompt
  155.    set lockScreen to false
  156.    exit to HyperCard
  157. end cleanExit
  158.  
  159.       --Use the following as an alternate to determine the offset.
  160.  
  161. if word 1 of it is "FOUND" then 
  162.    cleanExit it && "at character position" && offset┬
  163.    (string, the value of word 3 to 4 of it)
  164. end if
  165.  
  166. ====================
  167. Grouping Buttons
  168. by Sioux Lacy
  169.  
  170. Sioux Lacy, one of the outstanding HyperCard testers, has donated this script to provide you, the user, an often-desired script for moving a group of buttons and/or fields around on a card.  We are always trying to give you what you ask for, so please let us know if this script is helpful to you. --Editor
  171.  
  172. Many users have asked about grouping objects.  This stack presents a method for assigning to a group any number of buttons or fields, and then being able to move that group as a unit, or copying and pasting that group onto another card.  This is accomplished with a series of handlers in a card field, called ╥menuField╙.  It looks somewhat like a menu, accepts clicks on any command that it displays, and can be copied and pasted onto another card.
  173.  
  174. The menuField has a Help option that allows the user to read about each of its options.
  175.  
  176. Note that the menuField needs to be a card field in order to work properly.  And, when a group has been pasted, it will require re-grouping if its group identity is to work in the new context.  Also, since it is difficult to select overlapping objects to be members of a group, it is recommended that they be positioned so they don't overlap. 
  177.  
  178. Groupies 1.3 by Sioux Lacy, November 6, 1987.  AppleLink comments to me at LACY1, or send mail to Sioux Lacy, 
  179. MS 27-AQ, 20525 Mariani Ave., Cupertino, CA 95014.  
  180.  
  181. --Groupies 1.3 by Sioux Lacy
  182. --November 6, 1987
  183.  
  184. on NewField
  185.   get editBkgnd
  186.   if it is true then
  187.     set editBkgnd to false
  188.     put "The menuField cannot be a bkgnd field." &&  
  189.     "Delete this field & paste again.."
  190.     exit New Field
  191.   end if
  192.   put "Help" & return & "Group" & return & "Move" & return ┬
  193.   & "Copy" & return & "Paste" & return & "Clear" & return ┬
  194.   into card field id (the id of me)
  195.   choose browse tool
  196. end NewField
  197.  
  198. on mouseUp
  199.   put the id of me into myID
  200.   put the mouseV into clickLoc
  201.   put "HelpMe,NewGroup,MoveGroup,CopyGroup,PasteGroup,ClearGroup" ┬
  202.   into messages
  203.   repeat with x = 1 to the number of lines in card field id myID
  204.     put "" into char 1 of line x of card field id myID
  205.   end repeat
  206.   put the textHeight of me into height
  207.   put item 2 of the rect of me + height into baseLine
  208.   repeat with x = 1 to the number of lines in card field id myID
  209.     if clickLoc < baseLine then
  210.       put "├" into char 1 of line x of card field id myID
  211.       send item x of messages to me
  212.       exit mouseUp
  213.     end if
  214.     add height to baseLine
  215.   end repeat
  216. end mouseUp
  217.  
  218. on HelpMe
  219.   ask "Which option would you like help on?" with "Group"
  220.   if it is empty then exit HelpMe
  221.   if it is "Group" then
  222.     put "This option will let you specify objects to be grouped.
  223.   else if it is "Move" then
  224.     put "This option will let you move the group."
  225.   else if it is "Copy" then
  226.     put "This option used in conjunction with Paste will copy" && ┬
  227.     "& paste the group."
  228.   else if it is "Paste" then
  229.     put "This option used in conjunction with Copy will copy" && ┬
  230.     "& paste the group."
  231.   else if it is "Clear" then
  232.     put "This option will delete all the objects in the group."
  233.   else put "Never heard of that option.╙
  234. end HelpMe
  235.  
  236. on NewGroup
  237.   global objectList
  238.   put "Shift-click to include objects in group. Option-click when done."
  239.   put empty into objectList
  240.   repeat
  241.     set cursor to 2
  242.     wait until the mouseClick
  243.     put the mouseLoc into thisClick
  244.     set cursor to 4
  245.     if the optionKey is down then exit repeat
  246.     repeat with x = the number of card buttons down to 1
  247.      if isClickWithinObject (thisClick, rect of card btn x) then
  248.       put "card btn id " & the id of card btn x & "," after objectList
  249.       exit repeat
  250.     end if
  251.     end repeat
  252.     repeat with x = the number of bkgnd buttons down to 1    
  253.         if isClickWithinObject (thisClick, rect of bkgnd btn x) then
  254.       put "bkgnd btn id " & the id of bkgnd btn x & "," after objectList
  255.       exit repeat
  256.     end if 
  257.     end repeat
  258.     repeat with x = the number of card fields down to 1    
  259.         if isClickWithinObject (thisClick, rect of card field x) then
  260.       put "card field id " & the id of card field x & "," after objectList
  261.       exit repeat
  262.     end if 
  263.     end repeat
  264.     repeat with x = the number of bkgnd fields down to 1    
  265.         if isClickWithinObject (thisClick, rect of bkgnd field x) then
  266.       put "bkgnd field id " & the id of bkgnd field x & "," after objectList
  267.       exit repeat
  268.     end if 
  269.     end repeat
  270.   end repeat     
  271.   put empty into last char of objectList
  272.   put "The group consists of: " & objectList
  273. end NewGroup
  274.  
  275. function isClickWithinObject thisClick, theRect
  276.   if ((item 1 of theRect) <= (item 1 of thisClick)) and ┬
  277.   ((item 2 of theRect) <= (item 2 of thisClick)) and ┬
  278.   ((item 3 of theRect) >= (item 1 of thisClick)) and ┬
  279.   ((item 4 of theRect) >= (item 2 of thisClick)) then
  280.     return true  
  281.   else return false
  282. end isClickWithinObject
  283.    
  284. on MoveGroup
  285.   global objectList
  286.   if objectList is empty then
  287.     put "There are no objects in the group."
  288.     exit MoveGroup
  289.   end if
  290.   put "Click and drag the group with mouse down. There is an initial delay."
  291.   wait until the mouseClick
  292.   put the mouseLoc into myLoc
  293.   set cursor to 4
  294.   put empty into horizontalOffset
  295.   put empty into verticalOffset
  296.   repeat with i = 1 to the number of items in objectList
  297.     put the location of item i of objectList into theLoc
  298.     put item 1 of theLoc - item 1 of myLoc & "," after horizontalOffset
  299.     put item 2 of theLoc - item 2 of myLoc & "," after verticalOffset
  300.   end repeat
  301.   put empty into last char of horizontalOffset
  302.   put empty into last char of verticalOffset
  303.   set cursor to 2
  304.   repeat while the mouse is down
  305.     get the mouseLoc
  306.     repeat with i = 1 to the number of items in objectList
  307.       put it into theLoc
  308.       add item i of horizontalOffset to item 1 of theLoc
  309.       add item i of verticalOffset to item 2 of theLoc
  310.       set location of item i of objectList to theLoc
  311.     end repeat
  312.   end repeat
  313. end MoveGroup
  314.  
  315. on CopyGroup
  316.   global WhereTheGroupIs
  317.   set lockScreen to true
  318.   choose field tool
  319.   click at the location of me
  320.   doMenu "Copy Field"
  321.   choose browse tool
  322.   put the long id of this card into WhereTheGroupIs
  323.   put "Go to another card, type cmd-V, & choose Paste from the menuField."
  324.   set lockScreen to false
  325. end CopyGroup
  326.  
  327. on PasteGroup
  328.   global whereTheGroupIs, objectList
  329.   if whereTheGroupIs = empty then put "Please choose Copy from the menuField."
  330.   else if objectList = empty then put "There are no objects in the group."
  331.   else
  332.     set cursor to 4
  333.     set lockMessages to true
  334.     set lockScreen to true
  335.     repeat with i = 1 to the number of items in objectList
  336.       push this card
  337.       go to WhereTheGroupIs
  338.       get item i of objectList
  339.       if word 2 of it is "btn" then choose button tool
  340.       else choose field tool
  341.     if word 1 of it is "bkgnd" then set editBkgnd to true
  342.       click at the location of it
  343.       type "C" with commandKey
  344.       pop card
  345.       type "V" with commandKey
  346.     set editBkgnd to false
  347.     end repeat  
  348.     choose browse tool
  349.     put "To group these new objects, " & ┬
  350.      "choose Group from the menuField."
  351.     set lockScreen to false
  352.   end if
  353. end PasteGroup
  354.  
  355. on ClearGroup
  356.   global objectList
  357.   put "The group consists of: " & objectList
  358.   answer "Clearing group is not undoable. Are you sure?" ┬
  359.   with "Yes" or "Cancel"
  360.   if it is "Cancel" then exit ClearGroup
  361.   repeat with i = the number of items in objectList down to 1
  362.     get item i of objectList
  363.     if word 2 of it is "btn" then choose button tool
  364.     else choose field tool
  365.     click at the location of it
  366.     type "X" with commandKey
  367.   end repeat
  368.   choose browse tool
  369.   put empty into objectList
  370. end ClearGroup
  371.  
  372.